package service

import (
	"context"
	"errors"
	"fmt"
	"time"
	"gitee.com/chunanyong/logger"
	"gitee.com/chunanyong/zorm"
	"code/structs"
)

//SaveVisitRecordStruct 保存 
//如果入参ctx中没有dbConnection,使用defaultDao开启事务并最后提交
//如果入参ctx有dbConnection且没有事务,调用dbConnection.begin()开启事务并最后提交
//如果入参ctx有dbConnection且有事务,只使用不提交,有开启方提交事务
//但是如果遇到错误或者异常,虽然不是事务的开启方,也会回滚事务,让事务尽早回滚
func SaveVisitRecordStruct(ctx context.Context, visitrecordstruct *structs.VisitRecordStruct) error {

    // visitrecordstruct对象指针不能为空
	if  visitrecordstruct == nil {
		return errors.New("visitrecordstruct对象指针不能为空")
	}
    //匿名函数return的error如果不为nil,事务就会回滚
	_, errSaveVisitRecordStruct := zorm.Transaction(ctx,func(ctx context.Context) (interface{}, error) {

		//事务下的业务代码开始
		

		_,errSaveVisitRecordStruct := zorm.Insert(ctx, visitrecordstruct)

		if errSaveVisitRecordStruct != nil {
			return nil, errSaveVisitRecordStruct
		}

		return nil, nil
		//事务下的业务代码结束

	})

	//记录错误
	if errSaveVisitRecordStruct != nil {
		errSaveVisitRecordStruct := fmt.Errorf("service.SaveVisitRecordStruct错误:%w", errSaveVisitRecordStruct)
		logger.Error(errSaveVisitRecordStruct)
		return errSaveVisitRecordStruct
	}

	return nil
}

//UpdateVisitRecordStruct 更新
//如果入参ctx中没有dbConnection,使用defaultDao开启事务并最后提交
//如果入参ctx有dbConnection且没有事务,调用dbConnection.begin()开启事务并最后提交
//如果入参ctx有dbConnection且有事务,只使用不提交,有开启方提交事务
//但是如果遇到错误或者异常,虽然不是事务的开启方,也会回滚事务,让事务尽早回滚
func UpdateVisitRecordStruct(ctx context.Context, visitrecordstruct *structs.VisitRecordStruct) error {


	// visitrecordstruct对象指针或主键Id不能为空
	if  visitrecordstruct == nil || len(visitrecordstruct.Id) < 1 {
		return errors.New("visitrecordstruct对象指针或主键Id不能为空")
	}

    //匿名函数return的error如果不为nil,事务就会回滚
	_, errUpdateVisitRecordStruct := zorm.Transaction(ctx,func(ctx context.Context) (interface{}, error) {

		//事务下的业务代码开始
		_,errUpdateVisitRecordStruct := zorm.Update(ctx, visitrecordstruct)


		if errUpdateVisitRecordStruct != nil {
			return nil, errUpdateVisitRecordStruct
		}

		return nil, nil
		//事务下的业务代码结束

	})

	//记录错误
	if errUpdateVisitRecordStruct != nil {
		errUpdateVisitRecordStruct := fmt.Errorf("service.UpdateVisitRecordStruct错误:%w", errUpdateVisitRecordStruct)
		logger.Error(errUpdateVisitRecordStruct)
		return errUpdateVisitRecordStruct
	}

	return nil
}

//UpdateNotZeroVisitRecordStruct 更新
//如果入参ctx中没有dbConnection,使用defaultDao开启事务并最后提交
//如果入参ctx有dbConnection且没有事务,调用dbConnection.begin()开启事务并最后提交
//如果入参ctx有dbConnection且有事务,只使用不提交,有开启方提交事务
//但是如果遇到错误或者异常,虽然不是事务的开启方,也会回滚事务,让事务尽早回滚
func UpdateNotZeroVisitRecordStruct(ctx context.Context, visitrecordstruct *structs.VisitRecordStruct) error {

	// visitrecordstruct对象指针或主键Id不能为空
    if  visitrecordstruct == nil || len(visitrecordstruct.Id) < 1 {
    	return errors.New("visitrecordstruct对象指针或主键Id不能为空")
    }

    //匿名函数return的error如果不为nil,事务就会回滚
	_, errUpdateVisitRecordStruct := zorm.Transaction(ctx,func(ctx context.Context) (interface{}, error) {

		//事务下的业务代码开始
		_,errUpdateVisitRecordStruct := zorm.UpdateNotZeroValue(ctx, visitrecordstruct)


		if errUpdateVisitRecordStruct != nil {
			return nil, errUpdateVisitRecordStruct
		}

		return nil, nil
		//事务下的业务代码结束

	})

	//记录错误
	if errUpdateVisitRecordStruct != nil {
		errUpdateVisitRecordStruct := fmt.Errorf("service.UpdateNotZeroVisitRecordStruct错误:%w", errUpdateVisitRecordStruct)
		logger.Error(errUpdateVisitRecordStruct)
		return errUpdateVisitRecordStruct
	}

    return nil
}

//DeleteVisitRecordStructById 根据Id删除
//如果入参ctx中没有dbConnection,使用defaultDao开启事务并最后提交
//如果入参ctx有dbConnection且没有事务,调用dbConnection.begin()开启事务并最后提交
//如果入参ctx有dbConnection且有事务,只使用不提交,有开启方提交事务
//但是如果遇到错误或者异常,虽然不是事务的开启方,也会回滚事务,让事务尽早回滚
func DeleteVisitRecordStructById(ctx context.Context, id string) error {


	//id不能为空
	if len(id) < 1 {
		return errors.New("id不能为空")
	}

    //匿名函数return的error如果不为nil,事务就会回滚
	_, errDeleteVisitRecordStruct := zorm.Transaction(ctx,func(ctx context.Context) (interface{}, error) {

		//事务下的业务代码开始
		finder := zorm.NewDeleteFinder(structs.VisitRecordStructTableName).Append(" WHERE id=?", id)
		_,errDeleteVisitRecordStruct := zorm.UpdateFinder(ctx, finder)


		if errDeleteVisitRecordStruct != nil {
			return nil, errDeleteVisitRecordStruct
		}

		return nil, nil
		//事务下的业务代码结束

	})

    //记录错误
	if errDeleteVisitRecordStruct != nil {
		errDeleteVisitRecordStruct := fmt.Errorf("service.DeleteVisitRecordStruct错误:%w", errDeleteVisitRecordStruct)
		logger.Error(errDeleteVisitRecordStruct)
		return errDeleteVisitRecordStruct
	}

	return nil
}

//FindVisitRecordStructById 根据Id查询信息
//ctx中如果没有dbConnection,则会使用默认的datasource进行无事务查询
func FindVisitRecordStructById(ctx context.Context, id string) (*structs.VisitRecordStruct, error) {
	//id不能为空
	if len(id) < 1 {
		return nil, errors.New("id不能为空")
	}

	//根据Id查询
	finder := zorm.NewSelectFinder(structs.VisitRecordStructTableName).Append(" WHERE id=?", id)
	visitrecordstruct := structs.VisitRecordStruct{}
	has, errFindVisitRecordStructById := zorm.QueryRow(ctx, finder, &visitrecordstruct)

	//记录错误
	if errFindVisitRecordStructById != nil {
		errFindVisitRecordStructById := fmt.Errorf("service.FindVisitRecordStructById错误:%w", errFindVisitRecordStructById)
		logger.Error(errFindVisitRecordStructById)
		return nil, errFindVisitRecordStructById
	}

    if !has {
		return nil,nil
	}


	return &visitrecordstruct, nil

}

//FindVisitRecordStructList 根据Finder查询列表
//ctx中如果没有dbConnection,则会使用默认的datasource进行无事务查询
func FindVisitRecordStructList(ctx context.Context, finder *zorm.Finder, page *zorm.Page) ([]structs.VisitRecordStruct, error) {

	//finder不能为空
	if finder == nil {
		return nil, errors.New("finder不能为空")
	}

	visitrecordstructList := make([]structs.VisitRecordStruct, 0)
	errFindVisitRecordStructList := zorm.Query(ctx, finder, &visitrecordstructList, page)

	//记录错误
	if errFindVisitRecordStructList != nil {
		errFindVisitRecordStructList := fmt.Errorf("service.FindVisitRecordStructList错误:%w", errFindVisitRecordStructList)
		logger.Error(errFindVisitRecordStructList)
		return nil, errFindVisitRecordStructList
	}

	return visitrecordstructList, nil
}
